package com.edgar.barcode.control;

import android.app.Activity;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Vibrator;
import android.util.Log;

import java.io.IOException;

public final class BeepManager {

	private static final String TAG = BeepManager.class.getSimpleName();

	private static final float BEEP_VOLUME = 0.50f;
	private static final long VIBRATE_DURATION = 200L;

	private final Context context;
	private MediaPlayer mediaPlayer;
	private boolean playBeep;
	private boolean vibrate;
	private int beepId;

	public BeepManager(Context context) {
		this.context = context;
		this.mediaPlayer = null;
		playBeep = getShouldBeep(context);
	}

	/**
	 * 设置是否震动
	 * @param isVibrate
	 */
	public void setVibrate(boolean isVibrate){
		this.vibrate = isVibrate;
	}

	/**
	 * 设置Beep音频资源
	 * @param beepId
	 */
	public void setBeepResource(int beepId){
		this.beepId = beepId;
	}

	public void setPlayBeepEnable(boolean isPlayBeep){
		this.playBeep = isPlayBeep;
	}

	public void playBeepSoundAndVibrate() {
		if (playBeep && mediaPlayer == null) {
			// The volume on STREAM_SYSTEM is not adjustable, and users found it
			// too loud,
			// so we now play on the music stream.
			if(context instanceof Activity){
				((Activity) context).setVolumeControlStream(AudioManager.STREAM_MUSIC);
			}
			mediaPlayer = buildMediaPlayer(context);
		}
		if (playBeep && mediaPlayer != null) {
			mediaPlayer.start();
		}
		if (vibrate) {
			Vibrator vibrator = (Vibrator) context
					.getSystemService(Context.VIBRATOR_SERVICE);
			vibrator.vibrate(VIBRATE_DURATION);
		}
	}

	private boolean getShouldBeep(Context context) {
		boolean shouldPlayBeep = true;// 声音
		// See if sound settings overrides this
		AudioManager audioService = (AudioManager) context
				.getSystemService(Context.AUDIO_SERVICE);
		if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
			shouldPlayBeep = false;
		}
		return shouldPlayBeep;
	}

	private MediaPlayer buildMediaPlayer(Context context) {
		MediaPlayer mediaPlayer = new MediaPlayer();
		mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
		// When the beep has finished playing, rewind to queue up another one.
		mediaPlayer
				.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
					@Override
					public void onCompletion(MediaPlayer player) {
						player.seekTo(0);
					}
				});

		AssetFileDescriptor file = context.getResources().openRawResourceFd(
				beepId);
		try {
			mediaPlayer.setDataSource(file.getFileDescriptor(),
					file.getStartOffset(), file.getLength());
			file.close();
			mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
			mediaPlayer.prepare();
		} catch (IOException ioe) {
			Log.w(TAG, ioe);
			mediaPlayer = null;
		}
		return mediaPlayer;
	}
}
